package de.wbh.gwt.form.layouter.java.server;

import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;

public class SobelFunction {

	PixelGrabber grabber = null;
	static int width = 0, height = 0;

	static int[] kanteStart = new int[10000];
	static int[] kanteBreite = new int[10000];
	static int[] kanteHoehe = new int[10000];

	static int kantenzaehler = 0;

	static int threshold = 80;
	static boolean thresholdActive = true;

	public static int orig[] = null;

	static Sobel edgedetector;

	public static void kante(int[] original, int value, int x, int width) {
		if (((original[x] & 0xff) >= value) && ((original[x + (width * 10)] & 0xff) >= value) && ((original[x + (width * 20)] & 0xff) >= value) && ((original[x + 30] & 0xff) >= value)
				&& ((original[x + 15] & 0xff) >= value)) {
			kanteStart[kantenzaehler] = x;
			int tempZaehler = x;
			while ((original[tempZaehler] & 0xff) >= value) {
				kanteBreite[kantenzaehler] = (tempZaehler - kanteStart[kantenzaehler]);
				tempZaehler++;
			}

			tempZaehler = x;
			while ((original[tempZaehler] & 0xff) >= value) {
				kanteHoehe[kantenzaehler] = ((tempZaehler - kanteStart[kantenzaehler]) / width);
				tempZaehler = tempZaehler + width;
			}

			if (kanteBreite[kantenzaehler] < 10 || kanteHoehe[kantenzaehler] < 5) { // Falsche Kanten (z.B. Barcodes) werden somit ausgeschaltet
				kanteStart[kantenzaehler] = 0;
				kanteBreite[kantenzaehler] = 0;
				kanteHoehe[kantenzaehler] = 0;
				kantenzaehler--;
			}

			if (kantenzaehler < 0) {
				kantenzaehler = 0;
			}

			if (kanteBreite[kantenzaehler] > 100 && kanteHoehe[kantenzaehler] > 100) {
				kanteStart[kantenzaehler] = 0;
				kanteBreite[kantenzaehler] = 0;
				kanteHoehe[kantenzaehler] = 0;
				kantenzaehler--;
			}

			if (kantenzaehler < 0) {
				kantenzaehler = 0;
			}

			for (int f = 0; f < kantenzaehler; f++) {
				if (kanteStart[kantenzaehler] - kanteStart[f] < 3) {
					kantenzaehler--;
				}
			}

			kantenzaehler++;

			if (kantenzaehler < 0) {
				kantenzaehler = 0;
			}

		}

	}

	public static String[] sobelKanten(BufferedImage image) {

		String[] result = new String[10000];

		width = image.getWidth();
		height = image.getHeight();

		orig = new int[width * height];

		PixelGrabber grabber = new PixelGrabber(image, 0, 0, width, height, orig, 0, width);
		try {
			grabber.grabPixels();
		} catch (InterruptedException e2) {
			System.out.println("error: " + e2);
		}

		edgedetector = new Sobel();

		edgedetector.init(orig, width, height);
		int[] res = edgedetector.process();
		result = threshold(res, threshold, width, orig);

		return result;

	}

	public static String[] threshold(int[] original, int value, int width, int[] orig) {
		for (int x = 0; x < original.length; x++) {
			kante(original, value, x, width);
		}

		String[] kantenArray = new String[kantenzaehler];

		for (int k = 0; k < kantenzaehler; k++) {
			kantenArray[k] = kanteStart[k] + ";" + kanteBreite[k] + ";" + kanteHoehe[k];
		}

		return kantenArray;
	}

}